package implementaciones;

import interfaces.IScaner;
import interfaces.Tokens;
import errores.ErrorLexico;

public class DummyScaner implements IScaner{
	int contador=-1;
	private int nEjemplo;
	int defaultEjemplo = 21;
	
	public DummyScaner() {
		nEjemplo = defaultEjemplo;
	}
	
	public DummyScaner(int ejemplo)
	{
		nEjemplo = ejemplo;
	}
	
	@Override
	public Tokens leeToken() throws ErrorLexico {
		contador++;
		switch (nEjemplo)
		{
		case 1:
			return ejemplo1();
		case 6:
			return ejemplo6();
		case 20:
			return ejemplo20();
		case 21:
			return ejemplo21();
		}
		return Tokens.Error;
	}
	
	
	public Tokens ejemplo1() throws ErrorLexico {
		/* ------- ejemplo1.scr -----------
		 
		programa: prueba01.
		declaraciones:
		variable variableuno tipo entero;
		instrucciones:
		variableuno = 2;
		escribe(variableuno);
		 ---------------------------------- */
		switch(contador) {
		case 0:
			return Tokens.r1Programa;
		case 1:
			return Tokens.Identificador;
		case 2:
			return Tokens.Punto;
		case 3:
			return Tokens.r1Declaraciones;
		case 4:
			return Tokens.r1Variable;
		case 5:
			return Tokens.Identificador;
		case 6:
			return Tokens.r1Tipo;
		case 7:
			return Tokens.t1Entero;
		case 8:
			return Tokens.PuntoComa;
		case 9:
			return Tokens.r1Instrucciones;
		case 10:
			return Tokens.Identificador;
		case 11:
			return Tokens.Igual;
		case 12:
			return Tokens.t1Natural;
		case 13:
			return Tokens.PuntoComa;
		case 14:
			return Tokens.r1Escribe;
		case 15:
			return Tokens.ParentesisAbrir;
		case 16:
			return Tokens.Identificador;
		case 17:
			return Tokens.ParentesisCerrar;
		case 18:
			return Tokens.PuntoComa;
		case 19:
			return Tokens.EOF;
		}
		DeliverError("Demasiadas lecturas, me temo");
		return Tokens.Error;
	}
	
	public Tokens ejemplo6() throws ErrorLexico {
		/* ------- ejemplo6.scr -----------
		 
		programa: prueba06.
		declaraciones:
		variable enterovar tipo entero;
		instrucciones:
		enterovar = -2;
		escribe(enterovar);
		 ---------------------------------- */
		switch(contador) {
		case 0:
			return Tokens.r1Programa;
		case 1:
			return Tokens.Identificador;
		case 2:
			return Tokens.Punto;
		case 3:
			return Tokens.r1Declaraciones;
		case 4:
			return Tokens.r1Variable;
		case 5:
			return Tokens.Identificador;
		case 6:
			return Tokens.r1Tipo;
		case 7:
			return Tokens.t1Entero;
		case 8:
			return Tokens.PuntoComa;
		case 9:
			return Tokens.r1Instrucciones;
		case 10:
			return Tokens.Identificador;
		case 11:
			return Tokens.Igual;
		case 12:
			return Tokens.o1Menos;
		case 13:
			return Tokens.t1Natural;
		case 14:
			return Tokens.PuntoComa;
		case 15:
			return Tokens.r1Escribe;
		case 16:
			return Tokens.ParentesisAbrir;
		case 17:
			return Tokens.Identificador;
		case 18:
			return Tokens.ParentesisCerrar;
		case 19:
			return Tokens.PuntoComa;
		case 20:
			return Tokens.EOF;
		}
		DeliverError("Demasiadas lecturas, me temo");
		return Tokens.Error;
	}

	public Tokens ejemplo20() throws ErrorLexico {
		/* ------- ejemplo20.scr -----------
		 
		programa: prueba20.
		declaraciones:
		variable realvar tipo real;
		instrucciones:
		lee(realvar);
		escribe((ent)realvar);
		 ---------------------------------- */
		switch(contador) {
		case 0:
			return Tokens.r1Programa;
		case 1:
			return Tokens.Identificador;
		case 2:
			return Tokens.Punto;
		case 3:
			return Tokens.r1Declaraciones;
		case 4:
			return Tokens.r1Variable;
		case 5:
			return Tokens.Identificador;
		case 6:
			return Tokens.r1Tipo;
		case 7:
			return Tokens.t1Real;
		case 8:
			return Tokens.PuntoComa;
		case 9:
			return Tokens.r1Instrucciones;
		case 10:
			return Tokens.Identificador;
		case 11:
			return Tokens.Igual;
		case 12:
			return Tokens.t1Real;
		case 13:
			return Tokens.PuntoComa;
		case 14:
			return Tokens.r1Escribe;
		case 15:
			return Tokens.ParentesisAbrir;
		case 16:
			return Tokens.c1Entero;
		case 17:
			return Tokens.Identificador;
		case 18:
			return Tokens.ParentesisCerrar;
		case 19:
			return Tokens.PuntoComa;
		case 20:
			return Tokens.EOF;
		}
		DeliverError("Demasiadas lecturas, me temo");
		return Tokens.Error;
	}
	
	public Tokens ejemplo21() throws ErrorLexico {
		/* ------- MIO PROPIO -----------
		 
		programa: Todo Ok?.
		declaraciones:
		variable realvar tipo real;
		instrucciones:
		realvar = 1 * 2 + 3;
		escribe((ent)realvar);
		 ---------------------------------- */
		switch(contador) {
		case 0:
			return Tokens.r1Programa;
		case 1:
			return Tokens.Identificador;
		case 2:
			return Tokens.Punto;
		case 3:
			return Tokens.r1Declaraciones;
		case 4:
			return Tokens.r1Variable;
		case 5:
			return Tokens.Identificador;
		case 6:
			return Tokens.r1Tipo;
		case 7:
			return Tokens.t1Bool;
		case 8:
			return Tokens.PuntoComa;
		case 9:
			return Tokens.r1Instrucciones;
		case 10:
			return Tokens.Identificador;
		case 11:
			return Tokens.Igual;
		case 12:
			return Tokens.t1Bool;
		case 13:
			return Tokens.o1And;
		case 14:
			return Tokens.t1Bool;
		case 15:
			return Tokens.o1Or;
		case 16:
			return Tokens.t1Bool;
		case 17:
			return Tokens.PuntoComa;
		case 18:
			return Tokens.r1Escribe;
		case 19:
			return Tokens.ParentesisAbrir;
		case 20:
			return Tokens.c1Entero;
		case 21:
			return Tokens.Identificador;
		case 22:
			return Tokens.ParentesisCerrar;
		case 23:
			return Tokens.PuntoComa;
		case 24:
			return Tokens.EOF;
		}
		DeliverError("Demasiadas lecturas, me temo");
		return Tokens.Error;
	}
	
	@Override
	public int getLinea() {
		return contador - 1;
	}
	
	private void DeliverError(String mensaje) throws ErrorLexico {
		throw new ErrorLexico(mensaje, getLinea(), getColumna());
	}

	@Override
	public String getLexema() {
		switch (nEjemplo) {
		case 1:
			return getLexemaEjemplo1();
		case 6:
			return getLexemaEjemplo6();
		case 20:
			return getLexemaEjemplo20();
		case 21:
			return getLexemaEjemplo21();
		}
		return null;
	}
	
	String getLexemaEjemplo1() {
		if (contador <= 11)
			return "variableuno";
		if (contador <= 13)
			return "2";
		if (contador <= 17)
			return "variableuno";

		return null;
	}
	
	String getLexemaEjemplo6() {
		if (contador <= 10)
			return "enterovar";
		if (contador <= 13)
			return "2.1";
		if (contador <= 18)
			return "enterovar";

		return null;
	}
	
	String getLexemaEjemplo20() {
		if (contador <= 10)
			return "realvar";
		if (contador <= 14)
			return "2.4";
		if (contador <= 18)
			return "realvar";

		return null;
	}
	
	String getLexemaEjemplo21() {
		if (contador <= 11)
			return "realvar";
		if (contador <= 13)
			return "verdadero";
		if (contador <= 15)
			return "verdadero";
		if (contador <= 17)
			return "falso";
		if (contador <= 22)
			return "realvar";

		return null;
	}
	
	@Override
	public Tokens getTipo() {
		return Tokens.t1Bool;
		//return Tokens.t1Entero;
	}

	@Override
	public int getColumna() {
		// TODO Auto-generated method stub
		return -1;
	}

}
